Exception in thread "main" java.util.ConcurrentModificationException

Exception in thread "main" java.util.ConcurrentModificationException

บทความนี้เรามาดู Exception ที่เกิดขึ้นจากการรันโปรแกรมกันครับ ซึ่ง Exception นี้คือ ConcurrentModificationException ซึ่ง Exception นี้จะมีลักษณะข้อความคล้าย ๆ แบบนี้
 Exception in thread "main" java.util.ConcurrentModificationException 	at java.util.ArrayList$Itr.checkForComodification(Unknown Source) 	at java.util.ArrayList$Itr.next(Unknown Source) 	at com.doesystem.CodeFromDoesystem.main(CodeFromDoesystem.java:15) 


จากข้อความ Exception ข้างบนเราสามารถแปลข้อความบางส่วนได้ ดังนี้
Exception เกิด Exception
thread "main" ก็คือ thread ที่ชื่อว่า main
ConcurrentModificationException อาจจะแยกได้ดังนี้ Concurrent คือ เกิดขึ้นพร้อมกัน Modification การปรับเปลี่ยน

ถ้านำมารวม ๆ กันแล้วอาจจะได้ว่า เกิด Exception ที่ thread main เป็น Exception ชนิด ConcurrentModificationException แล้วก็เกิดที่ Class ArrayList ซึ่งเป็นการเปลี่ยนแปลงแก้ไขข้อมูลพร้อมกันขณะที่อ่านข้อมูล

เมื่อเรามาดูโค้ดที่ทำให้เกิด Exception กันตามด้านล่าง
 package com.doesystem;  import java.util.ArrayList; import java.util.List;  public class CodeFromDoesystem { 	public static void main(String[] args) throws Exception { 		List testList = new ArrayList() { 			{ 				add("a"); 				add("b"); 				add("c"); 			} 		}; 		for (String str : testList) { 			System.out.println(str); 			testList.add("d"); 		} 	} } 


จาก Exception และโค้ด เราเห็นจุดที่ทำให้เกิด Exception แล้ว จาก Exception มันบอกว่าอยู่บรรทัดที่ 15 เราก็ไปดูที่บรรทัดที่ 15 เป็นการวนลูปเพื่อนำข้อมูลของ List ออกมา แล้วลองไล่ลงมาดูอีกสองบรรทัดเป็นการ add ข้อมูลลงใน List

ตัวอย่างวิธีการแก้ไข

ตัวอย่างการแก้ไขตัวอย่างแรก ให้เราวนลูปค่าออกมาให้หมดก่อนแล้วค่อยแก้ไข หรือแก้ไขก่อน แล้วค่อยวนลูปดังตัวอย่าง
 package com.doesystem;  import java.util.ArrayList; import java.util.List;  public class CodeFromDoesystem { 	public static void main(String[] args) throws Exception { 		List testList = new ArrayList() { 			{ 				add("a"); 				add("b"); 				add("c"); 			} 		}; 		for (String str : testList) { 			System.out.println(str); 			//testList.add("d"); 		} 		testList.add("d"); 	} } 


ตัวอย่างการแก้ไขตัวอย่างที่สอง ให้เราเปลี่ยน List มาเป็น CopyOnWriteArrayList ดังตัวอย่าง
 package com.doesystem;  import java.util.concurrent.CopyOnWriteArrayList;  public class CodeFromDoesystem { 	public static void main(String[] args) throws Exception { 		CopyOnWriteArrayList testList = new CopyOnWriteArrayList() { 			{ 				add("a"); 				add("b"); 				add("c"); 			} 		}; 		for (String str : testList) { 			System.out.println(str); 			testList.add("d"); 		} 	} }